// 版权归Go作者所有。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package runtime

// fastlog2实现了与
// float64的基2日志的快速近似。这用于计算heap 
// 采样的几何分布，而不在包数学中引入依赖项。这个
// 使用float64指数和尾数前25位的
// 进行非常粗略的近似。尾数的前5位是
// 用于从常数表中加载限制，其余的是
// 用于在它们之间进行线性缩放。
func fastlog2(x float64) float64 {
	const fastlogScaleBits = 20
	const fastlogScaleRatio = 1.0 / (1 << fastlogScaleBits)

	xBits := float64bits(x)
	// 从IEEE float64中提取指数，并用尾数的前10位为常数
	// 表编制索引。
	xExp := int64((xBits>>52)&0x7FF) - 1023
	xManIndex := (xBits >> (52 - fastlogNumBits)) % (1 << fastlogNumBits)
	xManScale := (xBits >> (52 - fastlogNumBits - fastlogScaleBits)) % (1 << fastlogScaleBits)

	low, high := fastlog2Table[xManIndex], fastlog2Table[xManIndex+1]
	return float64(xExp) + low + (high-low)*float64(xManScale)*fastlogScaleRatio
}
